package com.ys.p3Set接口与HashSet与LinkedHashSet;

import java.util.HashSet;
import java.util.Iterator;

/**
 * 描述:
 *  1.HashSet的构造方法
 *  *    public HashSet()  --> 创建一个HashSet集合，其本质创建了一个空间长度为16的HashMap集合
 *  *       源码：public HashSet() {
 *  *                map = new HashMap<>();
 *  *            }
 *  *    public HashSet(int initialCapacity) --> 创建一个HashSet集合，其本质创建了指定空间长度的HashMap集合
 *  *       源码：public HashSet(int initialCapacity) {
 *  *                map = new HashMap<>(initialCapacity);
 *  *            }
 *  * 2.HashSet的底层分析
 *  *   HashSet底层采用是是“HashMap”来实现的，也就是说HashSet采用“哈希表”来实现的，我们分析add(E e)方法源码
 *  *      public boolean add(E e) {
 *  *          // 此处PRESENT是一个使用static修饰的Object对象
 *  *          return map.put(e, PRESENT)==null;
 *  *      }
 *  *   核心：HashSet本质上就是使用HashMap来存储key值，因此HashSet可以存储null。
 *  * 3.HashSet的特点
 *  *   存储的元素不能重复（因为HashMap的key值不能重复），并且存储的元素是无序的。
 *  * 4.HashSet的注意点
 *  *   通过HashSet存储元素的时候，存储的元素必须重写hashCode()方法和equals()方法。
 *  *   补充：如果存储的元素是java提供的类，那么无需重写hashCode()方法和equals()方法。
 *  *        如果存储的元素是自定义类，那么必须重写hashCode()方法和equals()方法。
 *
 * @author CodeYang
 * @version 2020/12/28 20:18
 */
public class HashSet了解与使用 {
    /**
     *  HashSet 的底层是简化版的HashMap,所以:满足HashMap的所有特点
     *  底层: 简化版的HashMap 因为 value 是一个固定的常量值
     *   private static final Object PRESENT = new Object(); final 修饰的一个常量.
     *   证明所有的values都是一样的,
     *   hashset 本质就是一个存储 key的hashmap
     *  public boolean add(E e) {
     *
     *         return map.put(e, PRESENT)==null;
     *     }
     *
     *  1: 无序-> hashcode 算法的无序性
     *  2: key 不能重复, 重复做覆盖操作
     * @param args
     */
    public static void main(String[] args) {
        HashSet<Integer> hashSet = new HashSet<>();
        hashSet.add(1);
        hashSet.add(1);
        hashSet.add(3);
        hashSet.add(4);
        for (Integer integer : hashSet) {
            System.out.println(integer);
        }
        System.out.println("__________________");
        Iterator<Integer> iterator = hashSet.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }


    }
}
